Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C]Problema con array di strutture e allocazione dinamica
Forum - C/C++ - [C]Problema con array di strutture e allocazione dinamica

Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 15:05
Giovedì, 01/09/2011
Devo dichiarare un array di strurre vuoto e poi nel corso del programma riallocare la memoria per l'array ogni volta che vi aggiungo una struttura. Prima però devo utilizzare malloc? La dichiarazione è corretta?

Codice sorgente - presumibilmente C/C++

  1. struct comp pa[0], *ppa = pa;




Se utilizzo malloc, il compilatore restituisce un errore.

Codice sorgente - presumibilmente Plain Text

  1. pa = malloc(sizeof(struct comp));



Qualche suggerimento? Grazie mille in anticipo per qualsialsi risposta.

PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 15:45
Giovedì, 01/09/2011
Allora...array di strutture vuol dire puntatore ad una cella di memoria che conterrà via via tutte gli elementi dell'array...

Codice sorgente - presumibilmente C/C++

  1. struct ciao array[0];



vuol dire dichiarare un array vuoto non più modificabile.

Codice sorgente - presumibilmente C/C++

  1. struct ciao *array;



Vuol dire dichiarare un puntatore che, se inizializzato allocando l'apposita memoria, costituirà un array (o altro ma in questo caso non ci interessa).

Quindi:

Codice sorgente - presumibilmente C/C++

  1. struct ciao *array;
  2. array=(struct ciao*)malloc(NumeroElementiArray*sizeof(struct ciao));
  3. array[0].elementoStruttura=qualcosa;
  4. ... //etc etc...



Una volta dichiarato un puntatore lo puoi allocare dove vuoi e quando ti serve, ricordati solo di liberare la memoria quando non la usi più:

Codice sorgente - presumibilmente Plain Text

  1. free(array);


PM Quote
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 16:06
Giovedì, 01/09/2011
Posto tutta la funzione:

Codice sorgente - presumibilmente C++

  1. struct comp *comps = 0;
  2. struct comp *ccompx(const char name[])
  3. {
  4. struct comp *p;
  5. struct comp *pa;
  6. glob = 0;
  7. pa = (struct comp*) malloc(sizeof(struct comp));
  8. if(!pa)
  9. {
  10.     puts("Ricerca interrotta.");
  11.     return 0;
  12. }
  13. int s;
  14. for(p = comps, s = 1; p; p = p->n, s++)
  15. {
  16.     int i = 0;
  17. for(; name[i] != p->name[i]; i++);
  18. if(p && name[i] == p->name[i])
  19. {
  20.     int a = 1;
  21.     for(; name[i + a] == p->name[i + a]; a++);
  22.     if(a == strlen(name))
  23.     {
  24.         pa[s - 1] = p; // errore
  25.         glob++;
  26.         realloc(pa, sizeof(struct comp) * s + 1);
  27.         if(!pa)
  28.         {
  29.             puts("Ricerca non completata.")
  30.             goto ret;
  31.         }
  32.     }
  33.     return 0;
  34. }
  35. }
  36. ret:
  37. return pa;
  38. }



Qual è l'errore in quell'assegnamento?

Ultima modifica effettuata da drewnik99 il 01/09/2011 alle 19:31
PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 17:46
Giovedì, 01/09/2011
La variabile "ppa" non la usi da nessuna parte quindi puoi dichiarare solo "pa" assegnandole poi il ritorno della funzione malloc...

Inoltre non vedo nessuna free e nella funzione realloc devi passare "pa" non "*pa".

p non lo inizializzi (non usi la malloc).

Probabilmente il programma ti va in crash...

PM Quote
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 19:00
Giovedì, 01/09/2011
*ppa serve, perchè se il programma non riesce a riallocare la memoria, realloc restituisce un puntatore nullo e occorre un altro puntatore perchè la funzione restituisca la struttura.
L'errore lo restituisce il compilatore, durante la compilazione, non in esecuzione.
Perchè dovrei inizzializzare p con malloc?

PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 19:18
Giovedì, 01/09/2011
Testo quotato

Postato originariamente da drewnik99:

*ppa serve, perchè se il programma non riesce a riallocare la memoria, realloc restituisce un puntatore nullo e occorre un altro puntatore perchè la funzione restituisca la struttura.
L'errore lo restituisce il compilatore, durante la compilazione, non in esecuzione.
Perchè dovrei inizzializzare p con malloc?



Perché dichiari un puntatore nullo e pretendi che punti a delle celle di memoria...
Ma che errore ti dà il compilatore che facciamo prima...

PM Quote
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 19:22
Giovedì, 01/09/2011
Errore: incompatible types when assigning to type 'struct comp' from type 'struct comp *'|

Ultima modifica effettuata da drewnik99 il 01/09/2011 alle 19:35
PM Quote
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 0:43
Venerdì, 02/09/2011
Ho apportato le seguenti modifiche:

Codice sorgente - presumibilmente C++

  1. struct comp *p = (struct comp*)malloc(sizeof(struct comp));
  2.     if(!p)
  3.     {
  4.         //
  5.     }
  6.     struct comp **pv = 0;
  7.     struct comp ***point;
  8.     int s;
  9.     for(p = comps, s = 1; p; p = p->n, s++)
  10.     {
  11.         unsigned int i = 0;
  12.         for(; name[i] != p->name[i]; i++);
  13.         if(p && name[i] == p->name[i])
  14.         {
  15.             unsigned int a = 1;
  16.             for(; name[i + a] == p->name[i + a]; a++);
  17.             if(a == strlen(name))
  18.             {
  19.                 pv = (struct comp **) realloc(pv, sizeof(struct   comp*) * (s + 1));
  20.                 if(!pv)
  21.                 {
  22.                     goto ret;
  23.                 }
  24.                 point = &pv;
  25.                 pv[s] = p;
  26.             }
  27.             continue;
  28.         }
  29.     }
  30.     pv[0]->code = s; // l'elemento 0 funge da contatore degli
  31. ret:                         // elementi totali
  32.     return point;
  33. }



Se volessi che la funzione restituisse questo vettore di strutture, in modo da poterlo utilizzare nella funzione principale, quali modifiche dovrei apllicare al codice?

Ultima modifica effettuata da drewnik99 il 02/09/2011 alle 0:58
PM Quote